let baseUrl = 'http://146.56.230.35:3007/'
$(function () {
  $('#userCode').on('blur', checkUserCode)
  $('#userName').on('blur', checkUserName)
  $('#userPassword').on('blur', checkUserPassword)
  $('#userRemi').on('blur', userRemi)
  $('#birthday').on('blur', checkBirthday)
  $('#phone').on('blur', checkPhone)
  $('.userRole').on('change', checkUserRole)

  //点击添加按钮触发的表单提交事件
  $('.addBtn').click(async function () {
    //验证所有表单元素的结果
    let f1 = await checkUserCode()
    // async修饰的函数，返回值是promise对象，promise保存的数据如何取出？
    // 使用promise.then(res=>{}).catch(e=>e)
    // let res  = await getPromise()
    console.log(f1)
    let f2 = await checkUserName()
    let f6 = await checkPhone()
    let f3 = checkUserPassword()
    let f4 = userRemi()
    let f5 = checkBirthday()
    let flag = f1 & f2 & f3 & f4 & f5 & f6
    console.log('flag=' + flag)
    if (flag) {
      //提交表单
      let res = await submitForm()
      console.log(res)
      //判断返回值
      if (res.code !== 200) {
        return alert('添加失败')
      }
      alert(res.msg)
      //执行跳转
      location = 'userList.html'
    }
  })
})

/**
 * 提交表单的函数
 * @date 2021-03-25
 * @returns {any}
 */
function submitForm() {
  let data = {
    userCode: $('#userCode').val(),
    userName: $('#userName').val(),
    userPassword: $('#userPassword').val(),
    gender: $('#gender').val(),
    phone: $('#phone').val(),
    userRole: $('.userRole:checked').val(),
    birthday: $('#birthday').val(),
    address: $('#address').val(),
  }
  return new Promise((resolve, reject) => {
    $.ajax({
      url: baseUrl + 'users/createUser',
      type: 'POST',
      data,
      success(res) {
        resolve(res)
      },
      error(err) {
        reject(err)
      },
      headers: {
        token: getToken().token,
      },
    })
  })
}

/**
 * 通过用户编码获得用户
 * @date 2021-03-25
 * @returns {any}
 */
function getUserByUserCode() {
  return new Promise((resolve, reject) => {
    $.ajax({
      url: 'http://146.56.230.35:3007/users/getUserByUserCode',
      data: { userCode: $('#userCode').val() },
      success(res) {
        resolve(res)
      },
      error(err) {
        reject(err)
      },
      headers: {
        token: getToken().token,
      },
    })
  })
}

/**
 * 通过用户名查询用户
 * @date 2021-03-25
 * @returns {any}
 */
function getUserByUserName() {
  return new Promise((resolve, reject) => {
    $.ajax({
      url: 'http://146.56.230.35:3007/users/getUserByUserName',
      data: { userName: $('#userName').val() },
      success(res) {
        resolve(res)
      },
      error(err) {
        reject(err)
      },
      async: true,
      headers: {
        token: getToken().token,
      },
    })
  })
}

/**
 * 通过电话查询用户
 * @date 2021-03-25
 * @returns {any}
 */
function getUserByPhone() {
  return new Promise((resolve, reject) => {
    $.ajax({
      url: 'http://146.56.230.35:3007/users/getUserByPhone',
      data: { phone: $('#phone').val() },
      success(res) {
        resolve(res)
      },
      error(err) {
        reject(err)
      },
      async: true,
      headers: {
        token: getToken().token,
      },
    })
  })
}

/**
 * 1、验证用户编码 唯一 、非空
 * @date 2021-03-23
 * @returns {any}
 */
async function checkUserCode() {
  let v = $('#userCode').val()
  let parent = $('#userCode').parent()
  let span = $('#userCode').next()
  span.html('')
  parent[0].className = ''
  //声明一个变量，保存ajax的返回值
  let resuslt = ''
  $.ajax({
    async: false,
    url: 'http://146.56.230.35:3007/users/getUserByUserCode',
    data: { userCode: $('#userCode').val() },
    success(res) {
      //把成功的返回值保存到resuslt中
      resuslt = res
    },
    error(err) {
      console.log(err)
    },
    headers: {
      token: getToken().token,
    },
  })
  //判断用户名是否被占用
  if (resuslt.user !== null) {
    //存在userCode=v的用户，不唯一
    parent[0].className = 'error'
    span.html('用户编码被占用')
    return false
  }
  //判断非空
  if (!v) {
    parent[0].className = 'error'
    span.html('用户编码不能为空')
    return false
  }
  //判断长度
  let reg = /^[a-zA-Z\d_$-]{6,12}$/
  if (!reg.test(v)) {
    parent[0].className = 'error'
    span.html('用户编码长度6-12位')
    return false
  }
  //判断唯一，使用promise对象获得异步结果
  //let res = await getUserByUserCode()
  // if (res.user !== null) {
  //   //存在userCode=v的用户，不唯一
  //   parent[0].className = 'error'
  //   span.html('用户编码被占用')
  //   return false
  // }
  span.html('用户编码正确')
  parent[0].className = 'ok'
  return true
}

/**
 * 2、验证用户名 唯一、非空、英文数字_
 * @date 2021-03-23
 * @returns {any}
 */
async function checkUserName() {
  let v = $('#userName').val()
  let parent = $('#userName').parent()
  let span = $('#userName').next()
  span.html('')
  parent[0].className = ''
  //判断非空
  if (!v) {
    parent[0].className = 'error'
    span.html('用户名不能为空')
    return false
  }
  //判断长度
  let reg = /^[a-zA-Z\d_$-]{6,12}$/
  if (!reg.test(v)) {
    parent[0].className = 'error'
    span.html('用户名长度6-12位')
    return false
  }
  //判断唯一
  let res = await getUserByUserName()
  if (res.user !== null) {
    //存在userCode=v的用户，不唯一
    parent[0].className = 'error'
    span.html('用户名被占用')
    return false
  }
  span.html('用户名正确')
  parent[0].className = 'ok'
  return true
}

/**
 * 3、验证密码 非空 长度必须>=6 包含部分特殊字符 str = '_$()-+*&{}@!%'
 * @date 2021-03-23
 * @returns {any}
 */
function checkUserPassword() {
  let str = '_$()-+*&{}@!%'
  let v = $('#userPassword').val()
  let parent = $('#userPassword').parent()
  let span = $('#userPassword').next()
  span.html('')
  parent[0].className = ''
  //判断空
  if (!v) {
    parent[0].className = 'error'
    span.html('密码不能为空')
    return false
  }
  //判断长度
  if (v.length > 12 || v.length < 6) {
    parent[0].className = 'error'
    span.html('密码长度6-12位')
    return false
  }
  //判断特殊字符,false表示没有特殊字符
  let flag = false
  for (let i = 0; i < str.length; i++) {
    let code = str[i]
    if (v.indexOf(code) !== -1) {
      flag = true
      break
    }
  }
  if (!flag) {
    parent[0].className = 'error'
    span.html('密码必须包含_$()-+*&{}@!%r任意字符')
    return false
  }
  span.html('密码正确')
  parent[0].className = 'ok'
  return true
}

/**
 * 4、验证重复密码
 * @date 2021-03-23
 * @returns {any}
 */
function userRemi() {
  let v = $('#userRemi').val()
  let parent = $('#userRemi').parent()
  let span = $('#userRemi').next()
  span.html('')
  parent[0].className = ''
  let flag = checkUserPassword()
  if (!flag) {
    parent[0].className = 'error'
    span.html('密码不正确')
    return false
  }
  let v1 = $('#userPassword').val()
  if (v1 !== v) {
    parent[0].className = 'error'
    span.html('重复密码输入不正确')
    return false
  }
  span.html('重复密码正确')
  parent[0].className = 'ok'
  return true
}

/**
 * 4、验证生日 非空 日期格式
 * @date 2021-03-23
 * @returns {any}
 */
function checkBirthday() {
  let v = $('#birthday').val()
  let span = $('#birthday').next()
  let parent = $('#birthday').parent()
  span.html('')
  parent[0].className = ''
  //判断空
  if (!v) {
    span.html('生日不能为空')
    parent[0].className = 'error'
    return false
  }
  //判断日期格式
  if (new Date(v) == 'Invalid Date') {
    span.html('生日格式不合法')
    parent[0].className = 'error'
    return false
  }
  span.html('生日正确')
  parent[0].className = 'ok'
  return true
}

/**
 * 5、验证电话，非空，唯一
 * @date 2021-03-23
 * @returns {any}
 */
async function checkPhone() {
  let phone = $('#phone')
  let v = phone.val()
  let parent = phone.parent()
  let span = phone.next()
  span.html('')
  parent[0].className = ''
  //1、判断空
  if (!v) {
    span.html('电话不能空！')
    parent[0].className = 'error'
    return false
  }
  //2、判断复合电话规则
  let reg = /^1[3456789]\d{9}$/
  if (!reg.test(v)) {
    span.html('电话不合法！')
    parent[0].className = 'error'
    return false
  }
  //3、判断唯一
  let res = await getUserByPhone()
  if (res.user !== null) {
    span.html('电话被占用了！')
    parent[0].className = 'error'
    return false
  }
  //正确的结果
  span.html('电话正确！')
  parent[0].className = 'ok'
  return true
}

/**
 * 6、验证角色，非空
 * @date 2021-03-23
 * @returns {any}
 */
function checkUserRole() {
  let v = $('.userRole:checked').val()
  console.log('v=' + v)

  let span = $('.role-span')
  let parent = $('.userRole').parent()
  span.html('')
  parent[0].className = ''
  if (!v) {
    parent[0].className = 'error'
    span.html('角色不能为空')
    return false
  }
  parent[0].className = 'ok'
  span.html('角色正确')
  return true
}
